package main

import (
	"context"
	"fmt"
	"log"
	"net"

	"gitee.com/go-course/go8/micro/rpc/grpc/hello/pb"
	"gitee.com/go-course/go8/micro/rpc/grpc/hello/server/auth"
	"github.com/infraboard/mcube/logger/zap"
	"google.golang.org/grpc"
)

func main() {
	// 初始化全局Logger
	zap.DevelopmentSetup()

	// 如果把我们实现了接口的对象HelloServiceServerImpl 注册给grpc框架

	// 1. 首先是通过grpc.NewServer()构造一个gRPC服务对象
	// 1.1添加一个中间件
	// grpc.UnaryServerInterceptor(mid1)
	// 1.2 可以
	// grpc.ChainUnaryInterceptor(mid1, mid2, mid3)
	// 1.3 构造一个添加中间件的服务端参数, 实现一个auth中间件
	grpcServer := grpc.NewServer(grpc.ChainUnaryInterceptor(auth.NewServerAuthInceptorImpl().Auth))

	// 2. 把实现了接口的对象注册给grpc server
	// go-grpc插件，帮忙生成了对象的注册方法
	// 把HelloServiceServer的实现HelloServiceServerImpl注册给grpcServer
	pb.RegisterHelloServiceServer(grpcServer, &HelloServiceServerImpl{})

	// 3. 启动Grpc服务器, grpcServer是建立在HTTP2 网络之上的
	lis, err := net.Listen("tcp", ":1234")
	if err != nil {
		log.Fatal(err)
	}
	if err := grpcServer.Serve(lis); err != nil {
		panic(err)
	}
}

// 写一个对象，实现HelloServiceServer
type HelloServiceServerImpl struct {
	// 嵌套UnimplementedHelloServiceServer, 用于向前兼容(框架)
	// UnimplementedHelloServiceServer该对象有很多默认参数, 嵌套后才能实现继承
	pb.UnimplementedHelloServiceServer
}

func (i *HelloServiceServerImpl) Greet(ctx context.Context, req *pb.Request) (*pb.Response, error) {
	return &pb.Response{Value: fmt.Sprintf("hello, %s", req.Value)}, nil
}
